STM8 Timer 2 and 3
Der Unterschied zwischen einem Zähler (Counter) und einem Timer besteht in der zusätzlichen Funktionalität eines „Timer Channels“. Hier wird unterschieden zwischen einer „Capture“ Funktion und einer „Compare“ Funktion, die im weiteren Verlauf beschrieben werden sollen.
Die Pins der Timer (TIMn_CHi) können alternativ als Eingang oder als Ausgang arbeiten. Die Umschaltung erfolgt im jeweiligen Register TIMn_CCMRi, für den entsprechenden Kanal.
Der „Output Compare“ Betrieb wird durch den Wert 0x00b in den Capture Compare Selection Bits CCiS aktiviert. In diesem Modus wird der Zählerstand kontinuierlich mit dem Wert im 16-Bit Capture/Compare Register verglichen und das Ergebnis des Vergleichs steuert den Logikzustand am Timer-Kanal-Ausgang OCi.
Die Struktur eines Compare-Kanals ist in nachfolgenden Bild dargestellt. Das Ergebnis des jeweiligen Vergleichs zwischen dem Zählerstand und dem Cap/Com Register wird über den „Output Mode“ Block selektiert und je nach Einstellung, direkt oder invertiert an das Ausgangs-Port angelegt.
Die Polarität des Ausgangssignals ist über die „CCiP“ Bits in den Registern TIMn_CCERi invertierbar und der Ausgang kann über die „CCiE“ Bits im gleichen Register komplett abgeschaltet werden.
Im Gegensatz zum Timer1 der STM8 Serie besitzen die Ausgangsschaltungen von Timer2 und Timer3 keine komplementären Ausgänge die extern über Pins zur Verfügung stehen.
Parallel dazu kann bei einem eintretenden „Compare“-Event (Zähler = C/C-Register oder alternativ Zähler > C/C-Register) ein Interrupt ausgelöst werden. Dafür muß der entsprechende Interrupt über die „CCiIE“ Bits im TIMn_EGR Register für den jeweiligen Kanal freigegeben werden.
Bei der Input Capture Funktion wird der jeweilige Timer-Pin als Eingang konfiguriert. Das dort anliegende externe Signal wird über eine Filterfunktion qualifiziert und danach hinsichtlich des gewünschten Verhaltens auf eine steigende oder fallende Flanke überprüft.
Ist der Eingang über die CCiS[1..0] Bits freigeschaltet so wird das Signal über einen Event-Teiler als Capture-Auslöser verwendet.
Für jeden Kanal eines Timers ist ein solches Register vorhanden. Die Register haben folgenden Inhalt (Bit2 bis Bit7), der sich durch die Auswahl der Bits CCiS[1..0] hinsichtlich der Funktion unterscheiden. Nachfolgend sind deshalb die höheren 6 Bit des Registers einmal für die Einstellungs als Ausgang und einmal für die Einstellung als Eingang beschrieben.
| TIMn_CCMRi Register - Cap / Com Mode Register (T2 = 0x00.5305/06/07, T3 = 00.5325/26h im STM8S) | |||||||||
| Register Name | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit2 | Bit 1 | Bit 0 | |
| TIMn_CCMRi | als Ausgang | reserv. | OCiM[2] | OCiM[1] | OCiM[0] | OCiPE | reserv. | CCiS[1] | CCiS[0] |
| Reset Wert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| TIMn_CCMRi | als Eingang | ICiF[3] | ICiF[2] | ICiF[1] | ICiF[0] | CiPSC[1] | ICiPSC[0] | CCiS[1] | CCiS[0] |
| Reset Wert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
Der Modus der Signalerzeugung wird über die Bits OCiM[2..0] im Register TIMn_CCMRi festgelegt. Für die Einstellung des Capture Modus über die OCiM[2..0] Bits gilt folgende Tabelle
| Compare Mode Einstellung | |||
| OCiM[2..0] | Modus | Aktion | OCiREF Signal |
| 000 | „Frozen“ | keine | kein Effekt (Reset Wert) |
| 001 | „Activ when match“ | OCiREF wird „high“ | das Signal geht auf „high“ und bleibt „high“ |
| 010 | „Inactive when match“ | OCiREF wird „low“ | das Signal geht auf „low“ und bleibt „low“ |
| 011 | „Toggle“ | OCiREF ändert Polarität | das Signal invertiert bei Gleichheit: CNT=CCR |
| 100 | „Force inactive“ | OCiREF statisch „low“ | das Signal ändert sich nicht mehr |
| 101 | „Force active“ | OCiREF statisch „high“ | das Signal ändert sich nicht mehr |
| 110 | „PWM active“ | CNTR < CCR „high“ | das Signal ist nur „high“ wenn CNTR < CCR-Wert |
| 111 | „PWM inactive“ | CNTR < CCR „low“ | das Signal ist nur „low“ wenn CNTR < CCR-Wert |
Wie das ARR-Register besitzt auch das Capture-Compare Register ein “Shadow”-Register das die Synchronisation einer Änderung des Register-Wertes im Zeitablauf ermöglicht. Das OCiPE Bit schaltet diese Synchronisation frei wenn es auf „1“ gesetzt ist.
Ist das OCiPE Bit dagegen „0“ so wird ein Schreibvorgang in das Capture-Compare-Register unmittelbar auch das Shadowregister ändern.
Im PWM Mode muss das „Shadow“-Register aktiviert sein damit eine Änderung des PWM-Werts mit dem Ausgangssignal synchronisiert wird und keine fehlerhaften PWM-Werte entstehen.
Die beiden CCiS[1..0] Bits definieren die Funktion der Timer-Pins. Es gilt folgende Einstellungstabelle:
| Capture Compare Signal Auswahl | |||
| CCiS[1..0] | Kanal-Modus | Signalpin | OCiREF Signal |
| 00 | Ausgang | TIMn_CHi ist Ausgang | OCiREF and TIMn_CHi |
| 01 | Eingang | TIMn_CHi ist Eingang | Signal wird gerouted, ICi-Signal an TI1FP1 |
| 10 | Eingang | TIMn_CHi ist Eingang | Signal wird gerouted, ICi-Signal an TI2FP1 |
| 11 | Eingang | ICi-Signal an TRC | Funktioniert nur mit TIM5 als Trigger Eingang |
| Capture Filter Einstellung | |||
| ICiF[3..0] | Abtastfrequenz | Abtastwerte | Beschreibung |
| 0000 | FMaster | N = 1 | kein Effekt |
| 0001 | FMaster | N = 2 | Der Eingang wird 2 x mit fMaster abgetastet |
| 0010 | FMaster | N = 4 | Der Eingang wird 4 x mit fMaster abgetastet |
| 0011 | FMaster | N = 8 | Der Eingang wird 8 x mit fMaster abgetastet |
| 0100 | FMaster/2 | N = 6 | Der Eingang wird 6 x mit fMaster/2 abgetastet |
| 0101 | FMaster/2 | N = 8 | Der Eingang wird 8 x mit fMaster/2 abgetastet |
| 0110 | FMaster/4 | N = 6 | Der Eingang wird 6 x mit fMaster/4 abgetastet |
| 0111 | FMaster/4 | N = 8 | Der Eingang wird 8 x mit fMaster/4 abgetastet |
| 1000 | FMaster/8 | N = 6 | Der Eingang wird 6 x mit fMaster/8 abgetastet |
| 1001 | FMaster/8 | N = 8 | Der Eingang wird 8 x mit fMaster/8 abgetastet |
| 1010 | FMaster/16 | N = 5 | Der Eingang wird 5 x mit fMaster/16 abgetastet |
| 1011 | FMaster/16 | N = 6 | Der Eingang wird 6 x mit fMaster/16 abgetastet |
| 1100 | FMaster/16 | N = 8 | Der Eingang wird 8 x mit fMaster/16 abgetastet |
| 1101 | FMaster/32 | N = 5 | Der Eingang wird 5 x mit fMaster/32 abgetastet |
| 1110 | FMaster/32 | N = 6 | Der Eingang wird 6 x mit fMaster/32 abgetastet |
| 1111 | FMaster/32 | N = 8 | Der Eingang wird 8 x mit fMaster/32 abgetastet |
Das Eingangssignal wird über dieses Filter das im Wesentlichen aus einem Zähler besteht, qualifiziert und dient als Unterdrückung von „Glitches“. Als Beispiel sei der Wert 0x1000b erklärt: Der Timer Eingang wird mit einer Frequenz von FMaster/8 = 16MHz / 8 = 2 MHz abgetastet und das Abtastsignal dient als Takt für den nachfolgenden Zähler der in dieser Einstellung 6 gültige Samples benötigt um das Eingangssignal zu akzeptieren.
Das vom Filter gelieferte Eingangssignal wird in dem nachfolgenden „Capture Prescaler“ weiter geteilt. Damit können mehrere „Events“ zu einem übergreifenden Event zusammengefasst werden. Die ICiPS[1..0] Bits definieren die Anzahl der nötigen Events.
| Input Capture Prescaler | |||
| ICiPS[1..0] | Teiler | Ausgangssignal | Funktion |
| 00 | 1 | jeder Event | Zähler-Capture bei jedem Eingangsevent |
| 01 | 2 | jeder zweite Event | |
| 10 | 4 | jeder vierte Event | |
| 11 | 8 | jeder achte Event | |
Die „Input Capture Vorteiler“ Einstellung kann im laufenden Betrieb überschrieben werden. Allerdings läuft der Zähler weiter und wird nicht zurückgesetzt. Sollte ein Reset des Zählers gewünscht werden so kann das CCiE Bit des Capture-Kanals zurückgesetzt und danach wieder aktiviert („1“) werden. Dadurch wird der Zähler auf „000“ gesetzt.
Das TIMn_CCER1 Register beinhaltet die Einstellungen für die Kanäle 1 und 2 des jeweiligen Timers. Für jeden Kanal steht ein Bit für die Freigabe bzw. für die verwendete Polarität bereit.
Diese Konfigurations-Bits haben wieder je nach Einstellung (Eingang/Ausgang) unterschiedliche Bedeutungen.
| TIMn_CCER1 Register - Cap / Com Enable Register (T2 = 0x00.5308h,T3 = 0x00.5327 im STM8S) | ||||||||||
| Register Name | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | ||
| TIMn_CCER1 | reserv. | reserv. | CC2P | CC2E | reserv. | reserv. | CC1P | CC1E | ||
| Reset Wert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
Kanal ist als Ausgang geschaltet:
| Bit 5 = CC2P Bit | = 0, „Compare“ Ausgang 2 ist „active high“(Polarity). |
| = 1, „Compare“ Ausgang 2 ist „active low“ (Polarity). |
Kanal ist als Eingang geschaltet:
| Bit 5 = CC2P Bit | = 0, „Capture“ erfolgt auf die steigende Flanke. |
| = 1, „Capture“ erfolgt auf die fallende Flanke. |
Kanal ist als Ausgang geschaltet:
| Bit 4 = CC2E Bit | = 0, „Compare“ Ausgang 2 ist deaktiviert. |
| = 1, „Compare“ Ausgang 2 ist aktiviert. |
Kanal ist als Eingang geschaltet:
| Bit 4 = CC2E Bit | = 0, „Capture“ Eingang 2 ist deaktiviert. |
| = 1, „Capture“ Eingang 2 ist aktiviert. |
Kanal ist als Ausgang geschaltet:
| Bit 1 = CC1P Bit | = 0, „Compare“ Ausgang 1 ist „active high“(Polarity). |
| = 1, „Compare“ Ausgang 1 ist „active low“ (Polarity). |
Kanal ist als Eingang geschaltet:
| Bit 1 = CC1P Bit | = 0, „Capture“ erfolgt auf die steigende Flanke. |
| = 1, „Capture“ erfolgt auf die fallende Flanke. |
Kanal ist als Ausgang geschaltet:
| Bit 0 = CC1E Bit | = 0, „Compare“ Ausgang ist deaktiviert. |
| = 1, „Compare“ Ausgang ist aktiviert. |
Kanal ist als Eingang geschaltet:
| Bit 0 = CC1E Bit | = 0, „Capture“ Eingang ist deaktiviert. |
| = 1, „Capture“ Eingang ist aktiviert. |
Das TIM2_CCER2 Register beinhaltet die Einstellungen für den Kanal 3 des Timers2. Für diesen Kanal steht ein Bit für die Freigabe bzw. für die verwendete Polarität bereit. Für Timer3 gibt es kein solches Register da dieser Timer nur 2 Cap/Com Kanäle besitzt.
Die Konfigurations-Bits haben wieder je nach Einstellung (Eingang/Ausgang) unterschiedliche Bedeutungen. Nur die Bits 0 und 1 sind relevant in diesem Register.
| TIM2_CCER2 Register - Cap / Com Enable Register (T2 = 0x00.5309h, T3 = nicht vorhanden im STM8S | ||||||||||
| Register Name | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | ||
| TIMn_CCER2 | reserv. | reserv. | reserv. | reserv. | reserv. | reserv. | CC3P | CC3E | ||
| Reset Wert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
Kanal ist als Ausgang geschaltet:
| Bit 1 = CC3P Bit | = 0, „Compare“ Ausgang ist „active high“(Polarity). |
| = 1, „Compare“ Ausgang ist „active low“ (Polarity). |
Kanal ist als Eingang geschaltet:
| Bit 1 = CC3P Bit | = 0, „Capture“ erfolgt auf die steigende Flanke. |
| = 1, „Capture“ erfolgt auf die fallende Flanke. |
Kanal ist als Ausgang geschaltet:
| Bit 0 = CC3E Bit | = 0, „Compare“ Ausgang ist deaktiviert. |
| = 1, „Compare“ Ausgang ist aktiviert. |
Kanal ist als Eingang geschaltet:
| Bit 0 = CC3E Bit | = 0, „Capture“ Eingang ist deaktiviert. |
| = 1, „Capture“ Eingang ist aktiviert. |
Für jeden der Cap/Com Kanäle in den Timern 2 und 3 gibt es ein 16-Bit Register das den jeweiligen Cap/Com-Wert aufnimmt. Der Zugriff auf diese Register erfolgt, wie bei den anderen 16-Bit Registern in den Timern über jeweils ein High“-Byte und ein „ Low“-Byte.
Die Cap/Com Register sind für Schreib/Lese-Voränge ebenfalls durch ein „Shadow“-Register „gepuffert“.
| TIMn_CCRiH Register - Cap/Com Register High (T2 = 0x00.530F/11/13, T3 = 0x00.532D/2Fh, im STM8S | ||||||||||
| Register Name | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | ||
| TIMn_CCRiH | CCRi[15] | CCRi[14] | CCRi[13] | CCRi[12] | CCRi[11] | CCRi[10] | CCRi[9] | CCRi[8] | ||
| Reset Wert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| TIMn_CCRiL Register - Cap/Com Register Low (T2 = 0x00.5310/12/14, T3 = 0x00.532E/30h, im STM8S | ||||||||||
| Register Name | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | ||
| TIMn_CCRiL | CCRi[7] | CCRi[6] | CCRi[5] | CCRi[4] | CCRi[3] | CCRi[2] | CCRi[1] | CCRi[0] | ||
| Reset Wert | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
Dieses Dokument sowie dessen Inhalt, insbesondere Texte, Fotografien und Grafiken, unterliegt dem Copyright (© 2017) und sind nur mit einer schriftlicher Zustimmung des Autors, Dipl.Ing.(FH) Franz Henkel zur vollständigen oder auszugsweisen Weiterverwendung in Form einer gedruckten oder elektronischen Kopie oder Replikation bzw. einer vollständigen oder auszugsweisen Bereitstellung des Inhalts in schriftlicher oder elektronischer Form, zu verwenden.